#include <sys/types.h>
#include <sys/wait.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>

int
main(int argc, char *argv[])
{
	 int pipefd[2];
	 pid_t cpid;
	 char buf;

	 if (argc != 2) {
			 fprintf(stderr, "Usage: %s <string>\n", argv[0]);
			 exit(EXIT_FAILURE);
	 }

	 if (pipe(pipefd) == -1) {
			 perror("pipe");
			 exit(EXIT_FAILURE);
	 }

	 cpid = fork();
	 if (cpid == -1) {
			 perror("fork");
			 exit(EXIT_FAILURE);
	 }

	 if (cpid == 0) {    /* Child reads from pipe */
			 close(pipefd[1]);          /* Close unused write end */

			 while (read(pipefd[0], &buf, 1) > 0)
					 write(STDOUT_FILENO, &buf, 1);

			 write(STDOUT_FILENO, "\n", 1);
			 printf("i am child (pid:%d)\n", (int)getpid());
			 close(pipefd[0]);
			 _exit(EXIT_SUCCESS);


	 } else {            /* Parent writes argv[1] to pipe */
			 printf("i am parent (pid:%d)\n", (int)getpid());
			 close(pipefd[0]);          /* Close unused read end */
			 write(pipefd[1], argv[1], strlen(argv[1]));
			 close(pipefd[1]);          /* Reader will see EOF */
			 wait(NULL);                /* Wait for child */
			 exit(EXIT_SUCCESS);
	 }
}

